From: Ian Jackson Date: Thu, 20 Jan 2011 17:04:06 +0000 (+0000) Subject: libxl: Make domain_shutdown fail if graceful not possible X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~10898 X-Git-Url: https://dgit.raspbian.org/%22http:/www.example.com/cgi/%22https:/%22bookmarks://%22Dat/%22http:/www.example.com/cgi/%22https:/%22bookmarks:/%22Dat?a=commitdiff_plain;h=c856ec5f96dd41e1d23528f6051ae6c29f49c716;p=xen.git libxl: Make domain_shutdown fail if graceful not possible Currently "xl shutdown" (like "xm shutdown") is not capable of doing the proper ACPI negotiation with an HVM no-pv-drivers guest which would be necessary for a graceful shutdown. Instead (following the ill-advised lead of "xm shutdown") it simply shoots the guest in the head. This patch changes the behaviour so that "xl shutdown" fails if the domain cannot be shut down gracefully for this reason and suggests in the error message using destroy instead. Also, check whether the PV shutdown protocol is available before we try to use it. Signed-off-by: Ian Jackson Acked-by: Ian Campbell Committed-by: Ian Jackson --- diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index a8f71951a9..2ddd24ee38 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -506,34 +506,26 @@ int libxl_domain_shutdown(libxl_ctx *ctx, uint32_t domid, int req) return ERROR_FAIL; } - shutdown_path = libxl__sprintf(&gc, "%s/control/shutdown", dom_path); - - xs_write(ctx->xsh, XBT_NULL, shutdown_path, req_table[req], strlen(req_table[req])); if (libxl__domain_is_hvm(ctx,domid)) { - unsigned long acpi_s_state = 0; unsigned long pvdriver = 0; int ret; - ret = xc_get_hvm_param(ctx->xch, domid, HVM_PARAM_ACPI_S_STATE, &acpi_s_state); + ret = xc_get_hvm_param(ctx->xch, domid, HVM_PARAM_CALLBACK_IRQ, &pvdriver); if (ret<0) { - LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "getting ACPI S-state"); + LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "getting HVM callback IRQ"); libxl__free_all(&gc); return ERROR_FAIL; } - ret = xc_get_hvm_param(ctx->xch, domid, HVM_PARAM_CALLBACK_IRQ, &pvdriver); - if (ret<0) { - LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "getting HVM callback IRQ"); + if (!pvdriver) { + LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "HVM domain without PV drivers:" + " graceful shutdown not possible, use destroy"); libxl__free_all(&gc); return ERROR_FAIL; } - if (!pvdriver || acpi_s_state != 0) { - ret = xc_domain_shutdown(ctx->xch, domid, req); - if (ret<0) { - LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "unpausing domain"); - libxl__free_all(&gc); - return ERROR_FAIL; - } - } } + + shutdown_path = libxl__sprintf(&gc, "%s/control/shutdown", dom_path); + xs_write(ctx->xsh, XBT_NULL, shutdown_path, req_table[req], strlen(req_table[req])); + libxl__free_all(&gc); return 0; }